// @title Go-Mall API
// @version 1.0
// @description Go-Mall电商平台API文档
// @termsOfService http://swagger.io/terms/

// @contact.name API Support
// @contact.url http://www.swagger.io/support
// @contact.email support@swagger.io

// @license.name Apache 2.0
// @license.url http://www.apache.org/licenses/LICENSE-2.0.html

// @host localhost:8082
// @BasePath /api
// @schemes http

// 主程序入口文件
package main

import (
	"gitee.com/ysl729895/go-mall/configs"
	_ "gitee.com/ysl729895/go-mall/docs" // 必须导入 docs 包
	"gitee.com/ysl729895/go-mall/internal/controller"
	"gitee.com/ysl729895/go-mall/internal/middleware"
	"gitee.com/ysl729895/go-mall/internal/model"
	"gitee.com/ysl729895/go-mall/internal/repository"
	"gitee.com/ysl729895/go-mall/internal/service"
	"gitee.com/ysl729895/go-mall/pkg/database"
	"github.com/gin-gonic/gin"
	swaggerFiles "github.com/swaggo/files"
	ginSwagger "github.com/swaggo/gin-swagger"
)

func main() {
	// 1. 加载配置
	cfg := configs.LoadConfig()

	// 2. 初始化数据库连接
	if err := database.InitDB(cfg.DB); err != nil {
		panic("数据库连接失败: " + err.Error())
	}

	// 自动迁移数据库表
	db := database.GetDB()
	if err := db.AutoMigrate(model.User{}, model.Product{}, model.Category{}); err != nil {
		panic("数据库迁移失败: " + err.Error())
	}

	// 3. 创建Gin引擎实例
	r := gin.Default()
	r.Use(middleware.RecoveryMiddleware()) // 添加全局错误处理
	r.Use(middleware.RequestLogger())      // 添加全局日志
	r.Use(middleware.ResponseMiddleware()) // 添加响应格式化中间件

	// 4. 依赖注入（逐层初始化）
	productRepo := repository.NewProductRepository(db)                   // 数据访问层
	productService := service.NewProductService(productRepo)             // 业务逻辑层
	productController := controller.NewProductController(productService) // 控制层
	// 1. 仓库层：直接操作数据库
	categoryRepo := repository.NewCategoryRepository(db)
	// 2. 服务层：处理业务逻辑
	categoryService := service.NewCategoryService(categoryRepo)
	// 3. 控制层：处理HTTP请求
	categoryController := controller.NewCategoryController(categoryService)

	// 用户模块初始化
	userRepo := repository.NewUserRepository(db)
	userService := service.NewUserService(userRepo, cfg.JWT.Secret)
	userController := controller.NewUserController(userService)

	// 初始化 repository 和 service
	roleRepo := repository.NewRoleRepository(db)
	permRepo := repository.NewPermissionRepository(db)
	userRoleRepo := repository.NewUserRoleRepository(db)
	rolePermRepo := repository.NewRolePermissionRepository(db)

	roleService := service.NewRoleService(roleRepo)
	permService := service.NewPermissionService(permRepo)
	userRoleService := service.NewUserRoleService(userRoleRepo)
	rolePermService := service.NewRolePermissionService(rolePermRepo)

	// 初始化 controller
	roleController := controller.NewRoleController(roleService)
	permController := controller.NewPermissionController(permService)
	userRoleController := controller.NewUserRoleController(userRoleService)
	rolePermController := controller.NewRolePermissionController(rolePermService)

	// 权限相关接口
	api := r.Group("/api")
	{
		// 角色管理接口（需管理员权限）
		roles := api.Group("/roles")
		roles.Use(middleware.AuthMiddleware([]byte(cfg.JWT.Secret), userRoleService, rolePermService), middleware.PermissionMiddleware("admin"))
		{
			roles.POST("", roleController.CreateRole)
			roles.POST("/update", roleController.UpdateRole)
			roles.POST("/delete", roleController.DeleteRole)
			roles.GET("", roleController.GetRole)

			// 角色-权限分配
			roles.POST(":role_id/permissions", rolePermController.AssignPermissionToRole)
			roles.DELETE(":role_id/permissions", rolePermController.RemovePermissionsFromRole)
			roles.GET(":role_id/permissions", rolePermController.GetPermissionsByRoleID)
		}

		// 权限管理接口（需管理员权限）
		perms := api.Group("/permissions")
		perms.Use(middleware.AuthMiddleware([]byte(cfg.JWT.Secret), userRoleService, rolePermService), middleware.PermissionMiddleware("admin"))
		{
			perms.POST("", permController.CreatePermission)
			perms.POST("/update", permController.UpdatePermission)
			perms.POST("/delete", permController.DeletePermission)
			perms.GET("", permController.GetPermission)
		}

		// 用户-角色分配接口（需管理员权限）
		userRoles := api.Group("/users/roles")
		userRoles.Use(middleware.AuthMiddleware([]byte(cfg.JWT.Secret), userRoleService, rolePermService), middleware.PermissionMiddleware("admin"))
		{
			userRoles.POST("", userRoleController.AssignRoleToUser)
			userRoles.DELETE("", userRoleController.RemoveRolesFromUser)
			userRoles.GET("", userRoleController.GetRolesByUserID)
		}
	}

	// 5. 路由设置
	// 用户模块路由
	userApi := r.Group("/api") // API分组
	{
		// 用户注册接口
		userApi.POST("/register", userController.Register)
		// 用户登录接口
		userApi.POST("/login", userController.Login)
		// 用户退出
		userApi.POST("/user/logout", userController.Logout)
	}
	userApi.Use(middleware.AuthMiddleware([]byte(cfg.JWT.Secret), userRoleService, rolePermService))
	{
		// 创建商品
		userApi.POST("/products", productController.CreateProduct)
		// 查询商品
		userApi.GET("/products", productController.GetProduct)
		// 创建分类接口
		userApi.POST("/categories", categoryController.CreateCategory)
		// 获取分类列表接口
		userApi.GET("/categories", categoryController.GetCategories)
		// 获取用户信息
		userApi.GET("/user/info", userController.GetUserInfo)
		// 更新用户信息
		userApi.POST("/user/update", userController.UpdateUserInfo)
		// 修改密码
		userApi.POST("/user/change-password", userController.ChangePassword)
	}
	// Swagger文档路由 (移到API分组外)
	r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))

	// 6. 启动HTTP服务
	r.Run(":" + cfg.Server.Port) // 监听指定端口
}
